﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Web;
using Event_Planner.Models;
using System.Web.Security;
using System.Web.Mvc;
using Event_Planner.Utils;


namespace Event_Planner.Controllers
{ 
    public class ContactosController : Controller
    {
        private DataAccess.Contactos DataAccessContactos = new DataAccess.Contactos();

        //
        // GET: /Contactos/
        public ActionResult Index()
        {
            if (!User.IsInRole("Administrador"))
                return View(DataAccessContactos.db.Usuarios.Find(User.Identity.Name).ContactosUsuario);

            return View();
        }

        //
        // GET: /Contactos/Details/5

        public ActionResult Details(int id)
        {
            ContactosModel Contacto = DataAccessContactos.db.Contactos.Find(id);
            if (Contacto == null)
                return RedirectToAction("ErrorPersonalizado", "Error", new { MensajeError = "el contacto ya no existe." });
            else
                return View(Contacto);
        }

        //
        // GET: /Contactos/Create

        public ActionResult Create()
        {
            return View();
        } 

        //
        // POST: /Contactos/Create

        [HttpPost]
        public ActionResult Create(ContactosModel contactomodel)
        {
            if (ModelState.IsValid)
            {
                DataAccessContactos.db.Usuarios.Find(User.Identity.Name).ContactosUsuario.Add(contactomodel);
                DataAccessContactos.db.SaveChanges();

                return RedirectToAction("Index");  
            }

            return View(contactomodel);
        }
        
        //
        // GET: /Contactos/Edit/5
 
        public ActionResult Edit(int id)
        {
            ContactosModel Contacto = DataAccessContactos.db.Contactos.Find(id);
            if (Contacto == null)
                return RedirectToAction("ErrorPersonalizado", "Error", new { MensajeError = "el contacto ya no existe." });
            else
                return View(Contacto);
        }

        //
        // POST: /Contactos/Edit/5

        [HttpPost]
        public ActionResult Edit(ContactosModel contactosmodel)
        {
            if (ModelState.IsValid)
            {
                ContactosModel Contacto = DataAccessContactos.db.Contactos.Find(contactosmodel.ID);

                if (Contacto == null)
                    return RedirectToAction("ErrorPersonalizado", "Error", new { MensajeError = "el contacto ya no existe." });
                else
                {
                    DataAccessContactos.db.Entry(contactosmodel).State = EntityState.Modified;
                    DataAccessContactos.db.SaveChanges();

                    return RedirectToAction("Index");
                }
            }
            return View(contactosmodel);
        }


        //
        // GET: /Contactos/Delete/5
 
        public ActionResult Delete(int id)
        {
             ContactosModel Contacto = DataAccessContactos.db.Contactos.Find(id);
             if (Contacto == null)
                    return RedirectToAction("ErrorPersonalizado", "Error", new { MensajeError = "el contacto ya no existe." });
             else
                 return View(Contacto);
        }

        //
        // POST: /Contactos/Delete/5

        [HttpPost, ActionName("Delete")]
        public ActionResult DeleteConfirmed(int id)
        {
            ContactosModel Contacto = DataAccessContactos.db.Contactos.Find(id);
            if (Contacto == null)
                return RedirectToAction("ErrorPersonalizado", "Error", new { MensajeError = "el contacto ya no existe." });
            else
            {
                DataAccessContactos.EliminarContacto(Contacto);
                return RedirectToAction("Index");
            }
        }

        protected override void Dispose(bool disposing)
        {
            DataAccessContactos.db.Dispose();
            base.Dispose(disposing);
        }

        
        public void ExportarContactos()
        {
            ImportarExportarContactos ImportarExportarContactos = new ImportarExportarContactos();
            ImportarExportarContactos.ExportarContactos(User.Identity.Name, Response);
        }


        public ActionResult ImportarContactos()
        {
            return View();
        }


        [HttpPost]
        public ActionResult ImportarContactos(HttpPostedFileBase file)
        {
            if (file != null)
            {
                ImportarExportarContactos ImportarExportarContactos = new ImportarExportarContactos();
                ImportarExportarContactos.ImportarContactos(User.Identity.Name, file);
                return RedirectToAction("Index");  
            }
            else
               ViewBag.ErrorMessage = "No seleccionó ningún archivo.";

            return View();
        }


        public ActionResult EliminarTodosLosContactos()
        {
            return View();
        }


        [HttpPost, ActionName("EliminarTodosLosContactos")]
        public ActionResult EliminarTodosLosContactosConfirmado()
        {
            DataAccessContactos.EliminarContactosPropios(DataAccessContactos.db.Usuarios.Find(User.Identity.Name));
            return RedirectToAction("Index");  
        }


        //
        // GET: /Contactos/VerParticipantesDeEvento/5

        public ViewResult VerParticipantesDeEvento(int IDEvento)
        {
            ViewBag.IDEvento = IDEvento;
            return View(DataAccessContactos.db.Eventos.Find(IDEvento).ParticipantesEvento);
        }


        public ViewResult VerParticipantesDeEventoPublico(int IDEvento)
        {
            ViewBag.IDEvento = IDEvento;
            return View(DataAccessContactos.db.Eventos.Find(IDEvento).ParticipantesEvento);
        }
        

        //
        // GET: /Contactos/AsociarParticipantesAEvento/5

        public ActionResult AsociarParticipantesAEvento(int IDEvento)
        {
            EventosModels Evento = DataAccessContactos.db.Eventos.Find(IDEvento);
            if (Evento == null)
                return RedirectToAction("ErrorPersonalizado", "Error", new { MensajeError = "el evento ya no existe." });
            else
            {
                ViewData["IDEvento"] = IDEvento;

                DataAccess.Eventos DataAccessEventos = new DataAccess.Eventos();

                List<SeleccionContactosModel> ListaSeleccionContactosModel = new List<SeleccionContactosModel>();

                foreach (ContactosModel Participante in DataAccessContactos.db.Usuarios.Find(User.Identity.Name).ContactosUsuario)
                {
                    SeleccionContactosModel seleccioncontactosmodel = new SeleccionContactosModel
                    {
                        ID = Participante.ID,
                        NombreContacto = Participante.NombreContacto,
                        ApellidoContacto = Participante.ApellidoContacto,
                        EmailContacto = Participante.EmailContacto,
                        ParticipanteDelEvento = DataAccessEventos.EsParticipanteDelEvento(Participante, IDEvento),
                        ParticipanteConfirmacionDelEvento = DataAccessEventos.EstaConfirmadoParticipanteEvento(Participante.ID, IDEvento)
                    };

                    ListaSeleccionContactosModel.Add(seleccioncontactosmodel);
                }

                return View(ListaSeleccionContactosModel);
            }
        }


        //
        // POST: /Contactos/AsociarParticipantesAEvento/

        [HttpPost]
        public ActionResult AsociarParticipantesAEvento(int[] ID, int[] IDConfirmacion, int IDEvento)
        {
            EventosModels Evento = DataAccessContactos.db.Eventos.Find(IDEvento);
            if (Evento == null)
                return RedirectToAction("ErrorPersonalizado", "Error", new { MensajeError = "el evento ya no existe." });
            else
            {
                DataAccess.Eventos DataAccessEventos = new DataAccess.Eventos();
                DataAccessEventos.EliminarParticipantesDelEvento(IDEvento);
                if (ID != null)
                {
                    foreach (int IDParticipante in ID)
                    {
                        ContactosModel Participante = DataAccessContactos.db.Contactos.Find(IDParticipante);
                        if (Participante == null)
                            return RedirectToAction("ErrorPersonalizado", "Error", new { MensajeError = "el o los participantes ya no existen." });
                        else
                        {
                            bool EstaConfirmado = false;
                            if (IDConfirmacion != null)
                            {
                                foreach (int IDConfirmacionManual in IDConfirmacion)
                                {
                                    if (IDConfirmacionManual == IDParticipante)
                                        EstaConfirmado = true;
                                }
                            }
                            EventoConfirmacion eventoconfirmacion = new EventoConfirmacion
                            {
                                Participante = Participante,
                                Evento = Evento,
                                Confirmacion = EstaConfirmado
                            };

                            if (EstaConfirmado == false)
                            // Entonces se le envia un mail al contacto para la confirmacion
                            {
                                Utils.Mails mail = new Utils.Mails();
                                try { mail.EnviarMail(IDParticipante, Participante, IDEvento, Evento); }
                                catch (System.Net.Mail.SmtpException)
                                { 
                                    return RedirectToAction("ErrorPersonalizado", "Error", new { MensajeError = "hubo un problema para enviar el mail de confirmacion." }); 
                                }
                            }

                            Participante.EventosParticipantes.Add(eventoconfirmacion);

                        }
                        DataAccessContactos.db.SaveChanges();
                    }
                }
            }
            return RedirectToAction("Index", "Eventos");
        }



        //
        // GET: /Contactos/ConfirmacionAlEvento/
        [AllowAnonymous]
        public ActionResult ConfirmacionAlEvento(int IDParticipante, int IDEvento)
        {
              
            ViewData["IDParticipante"] = IDParticipante;
            ViewData["IDEvento"] = IDEvento;

            EventosModels Evento = DataAccessContactos.db.Eventos.Find(IDEvento);

            if (Evento == null)
                return RedirectToAction("ErrorPersonalizado", "Error", new { MensajeError = "ya no existe el evento." });
            else
            {
                DataAccess.Eventos DataAccessEventos = new DataAccess.Eventos();
                try
                {
                    if (DataAccessEventos.EsParticipanteDelEvento(DataAccessContactos.db.Contactos.Find(IDParticipante), IDEvento) == false)
                        throw new NullReferenceException();
                }
                catch (System.NullReferenceException)
                {
                    return RedirectToAction("ErrorPersonalizado", "Error", new { MensajeError = "ya no estas invitado a este evento." });
                }
            }

            return View(Evento); 
        }


        //
        // POST: /Contactos/ConfirmacionAlEvento/
        [AllowAnonymous]
        [HttpPost, ActionName("ConfirmacionAlEvento")]
        public ActionResult ConfirmacionAlEventoConfirmado(int IDParticipante, int IDEvento)
        {
            EventosModels Evento = DataAccessContactos.db.Eventos.Find(IDEvento);

            ContactosModel Participante = DataAccessContactos.db.Contactos.Find(IDParticipante);

            DataAccess.Eventos DataAccessEventos = new DataAccess.Eventos();

            try
            {
                DataAccessEventos.EliminarConfirmacionParticipanteEvento(Participante, IDEvento);
            }
            catch (System.NullReferenceException)
            {
                return RedirectToAction("ErrorPersonalizado", "Error", new { MensajeError = "ya no estas invitado a este evento." });
            }

            EventoConfirmacion eventoconfirmacion = new EventoConfirmacion
            {
                        
                        Evento = Evento,
                        Confirmacion = true
            };


            Participante.EventosParticipantes.Add(eventoconfirmacion);

            DataAccessContactos.db.SaveChanges();

            return RedirectToAction("Index", "Home");
        }


    }
}